#ifndef GUIMANAGER_H
#define GUIMANAGER_H

#include "../singleton.h"
#include "../cjson.h"
#include "guibasenode.h"
#include "guibutton.h"

#include <map>
#include <mutex>

class GuiManager : public Singleton<GuiManager>
{
public:
    GuiManager();
    ~GuiManager();

    /// 解析Json
    void parsingJson(cJSON *routecondi);

    /// 添加一个按钮到系统中
    GuiButton* addButton(int id,wxString btnName,wxRect rect);

    /// 删除所有的控件
    void deleteAllNodes(void);
    /// 检测指定ID的控件是否在系统中
    GuiBaseNode* getBaseNodeByID(int id);
    /// 更改指定ID的控件的ID
    bool updateBaseNodeID(int oldId,int newId);
    /// 删除指定ID的控件
    bool deleteBaseNodeByID(int id);
    /// 得到当前选中的控件
    inline GuiBaseNode* getCurrentSelectedNode(void) { return mCurSelectedBaseNode; }
    /// 重置当前选中的控件
    inline void resetCurrentSelectedNode(void) { mCurSelectedBaseNode = NULL; }
    /// 重置所有的控件
    void resetAllNodes(void);

    /// 工作区域改变
    void changeWorkingRect(wxRect workingrect);
    /// 更新
    void update(void);
    /// 绘制
    void draw(maindrawscene *painter);
    /// 处理鼠标事件
    GuiBaseNode* OnMMouseEvent(wxMouseEvent event);
    /// 重置结点状态
    void reset(void);
    /// 得到所有的结点
    inline std::map<int,GuiBaseNode*> getAllBaseNodes(void) { return mBaseNodes; }

private:
    wxRect ConvertStringToRect(wxString str);
    wxColour ConvertStringToColour(wxString str);

private:
    std::map<int,GuiBaseNode*> mBaseNodes;             /**< 管理所有的结点 */
    std::mutex mNodeMutex;                                /**< 保护所有结点 */
    GuiBaseNode *mCurSelectedBaseNode;                 /**< 当前选中的结点 */
};

#endif // GUIMANAGER_H
